<?php

class Ministrante {

    public function post_save($ministrante) {

        if ($ministrante->id) {


            //verifica se o login foi alterado, e se foi, deve verificar
            // se o login já existe para outro usuário
            $sqlUsuario  = "SELECT id,login FROM usuarios WHERE id=:id";
            $stmtUsuario = DB::prepare($sqlUsuario);
            $stmtUsuario->bindParam("id", $ministrante->idUsuario);
            $stmtUsuario->execute();
            $usuario     = $stmtUsuario->fetch();
            if ($usuario->login != $ministrante->login) {
                $sqlSelect  = "SELECT id,nome FROM usuarios WHERE (login=:login)";
                $stmtSelect = DB::prepare($sqlSelect);
                $stmtSelect->bindValue("login", $ministrante->login);
                $stmtSelect->execute();
                $usuario    = $stmtSelect->fetch();
                if ($usuario)
                    throw new Exception("Login pertencente ao usuário '{$usuario->nome}'");
            }

            //update
            $sqlUpdateUsuario = "UPDATE usuarios SET nome=:nome,email=:email,login=:login,senha=:senha WHERE id=:idUsuario";

            $sqlUpdateMinistrante = "UPDATE ministrantes SET razaoSocial=:razaoSocial,assessor=:assessor,cnpj=:cnpj,conta=:conta,agencia=:agencia,
                banco=:banco,formacao=:formacao,site=:site,rua=:rua,numero=:numero,complemento=:complemento,
                bairro=:bairro,cep=:cep,uf=:uf,cidade=:cidade,telefone=:telefone,celular=:celular,operadora=:operadora,dn=:dn,rg=:rg,sexo=:sexo,
                cpf=:cpf,curriculo=:curriculo,curriculoFile=:curriculoFile WHERE id = :id";
            try {

                DB::beginTransaction();

                $stmtUsuario = DB::prepare($sqlUpdateUsuario);
                $stmtUsuario->bindParam("nome", $ministrante->nome);
                $stmtUsuario->bindParam("email", $ministrante->email);
                $stmtUsuario->bindParam("login", $ministrante->login);
                $stmtUsuario->bindParam("senha", $ministrante->senha);
                $stmtUsuario->bindParam("idUsuario", $ministrante->idUsuario);
                $stmtUsuario->execute();

                $stmtMinistrante = DB::prepare($sqlUpdateMinistrante);
                $stmtMinistrante->bindParam("id", $ministrante->id);
                $stmtMinistrante->bindParam("razaoSocial", $ministrante->razaoSocial);
                $stmtMinistrante->bindParam("assessor", $ministrante->assessor);
                $stmtMinistrante->bindParam("cnpj", $ministrante->cnpj);
                $stmtMinistrante->bindParam("conta", $ministrante->conta);
                $stmtMinistrante->bindParam("agencia", $ministrante->agencia);
                $stmtMinistrante->bindParam("banco", $ministrante->banco);
                $stmtMinistrante->bindParam("formacao", $ministrante->formacao);
                $stmtMinistrante->bindParam("site", $ministrante->site);
                $stmtMinistrante->bindParam("rua", $ministrante->rua);
                $stmtMinistrante->bindParam("numero", $ministrante->numero);
                $stmtMinistrante->bindParam("complemento", $ministrante->complemento);
                $stmtMinistrante->bindParam("bairro", $ministrante->bairro);
                $stmtMinistrante->bindParam("cep", $ministrante->cep);
                $stmtMinistrante->bindParam("uf", $ministrante->uf);
                $stmtMinistrante->bindParam("cidade", $ministrante->cidade);
                $stmtMinistrante->bindParam("telefone", $ministrante->telefone);
                $stmtMinistrante->bindParam("celular", $ministrante->celular);
                $stmtMinistrante->bindParam("operadora", $ministrante->operadora);
                $stmtMinistrante->bindParam("dn", $ministrante->dn);
                $stmtMinistrante->bindParam("rg", $ministrante->rg);
                $stmtMinistrante->bindParam("sexo", $ministrante->sexo);
                $stmtMinistrante->bindParam("cpf", $ministrante->cpf);
                $stmtMinistrante->bindParam("curriculo", $ministrante->curriculo);
                $stmtMinistrante->bindParam("curriculoFile", $ministrante->curriculoFile);
                $stmtMinistrante->execute();


                DB::commit();
            }
            catch (Exception $e) {
                DB::rollBack();
                throw new Exception($e->getMessage());
            }
        }
        else {
            //Verificar se login já existem
            $sqlSelect  = "SELECT id,nome FROM usuarios where (login=:login)";
            $stmtSelect = DB::prepare($sqlSelect);
            $stmtSelect->bindValue("login", $ministrante->login);
            $stmtSelect->execute();
            $usuario    = $stmtSelect->fetch();
            if ($usuario)
                throw new Exception("Login pertencente ao usuário '{$usuario->nome}'");

            //Se já existir um cliente com mesmo nome    
            $sqlRegistroDuplo  = "SELECT id,nome FROM usuarios where (nome =:nome)";
            $stmtRegistroDuplo = DB::prepare($sqlRegistroDuplo);
            $stmtRegistroDuplo->bindValue("nome", $ministrante->nome);
            $stmtRegistroDuplo->execute();
            $ministranteDuplo  = $stmtRegistroDuplo->fetch();
            if ($ministranteDuplo)
                throw new Exception("Ops! este ministrante já existe.");


            //insert
            $sqlInsertUsuario     = "INSERT INTO usuarios (nome,email,login,senha,tipo) VALUES (:nome,:email,:login,:senha,:tipo)";
            
            $sqlInsertMinistrante = "INSERT INTO ministrantes (idUsuario,razaoSocial,assessor,cnpj,conta,agencia,
                banco,formacao,site,rua,numero,complemento,bairro,cep,uf,cidade,telefone,celular,operadora,dn,rg,sexo,cpf,curriculo,curriculoFile) 
                VALUES (:idUsuario,:razaoSocial,:assessor,:cnpj,:conta,:agencia,:banco,:formacao,:site,:rua,:numero,:complemento,:bairro,:cep,:uf,
                :cidade,:telefone,:celular,:operadora,:dn,:rg,:sexo,:cpf,:curriculo,:curriculoFile)";
            try {

                DB::beginTransaction();

                $ministrante->tipo = "m";

                $stmtUsuario = DB::prepare($sqlInsertUsuario);
                $stmtUsuario->bindParam("nome", $ministrante->nome);
                $stmtUsuario->bindParam("email", $ministrante->email);
                $stmtUsuario->bindParam("login", $ministrante->login);
                $stmtUsuario->bindParam("senha", $ministrante->senha);
                $stmtUsuario->bindParam("tipo", $ministrante->tipo);
                $stmtUsuario->execute();

                $ministrante->idUsuario = DB::lastInsertId();

                $stmtMinistrante = DB::prepare($sqlInsertMinistrante);
                $stmtMinistrante->bindParam("idUsuario", $ministrante->idUsuario);
                $stmtMinistrante->bindParam("razaoSocial", $ministrante->razaoSocial);
                $stmtMinistrante->bindParam("assessor", $ministrante->assessor);
                $stmtMinistrante->bindParam("cnpj", $ministrante->cnpj);
                $stmtMinistrante->bindParam("conta", $ministrante->conta);
                $stmtMinistrante->bindParam("agencia", $ministrante->agencia);
                $stmtMinistrante->bindParam("banco", $ministrante->banco);
                $stmtMinistrante->bindParam("formacao", $ministrante->formacao);
                $stmtMinistrante->bindParam("site", $ministrante->site);
                $stmtMinistrante->bindParam("rua", $ministrante->rua);
                $stmtMinistrante->bindParam("numero", $ministrante->numero);
                $stmtMinistrante->bindParam("complemento", $ministrante->complemento);
                $stmtMinistrante->bindParam("bairro", $ministrante->bairro);
                $stmtMinistrante->bindParam("cep", $ministrante->cep);
                $stmtMinistrante->bindParam("uf", $ministrante->uf);
                $stmtMinistrante->bindParam("cidade", $ministrante->cidade);
                $stmtMinistrante->bindParam("telefone", $ministrante->telefone);
                $stmtMinistrante->bindParam("celular", $ministrante->celular);
                $stmtMinistrante->bindParam("operadora", $ministrante->operadora);
                $stmtMinistrante->bindParam("dn", $ministrante->dn);
                $stmtMinistrante->bindParam("rg", $ministrante->rg);
                $stmtMinistrante->bindParam("sexo", $ministrante->sexo);
                $stmtMinistrante->bindParam("cpf", $ministrante->cpf);
                $stmtMinistrante->bindParam("curriculo", $ministrante->curriculo);
                $stmtMinistrante->bindParam("curriculoFile", $ministrante->curriculoFile);
                $stmtMinistrante->execute();

                DB::commit();
            }
            catch (Exception $e) {
                DB::rollBack();
                throw new Exception($e->getMessage());
            }

            return $ministrante;
        }
    }

    //Gera automaticamente um login e senha para o ministrante e chama o método que faz o insert do 
    //ministrante passando o login e senha gerados
    function post_geraLoginSenha($ministrante) {
        try {
            if (!$ministrante->id) {
                $letters            = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
                $login              = substr(str_shuffle($letters), 0, 8);
                $senha              = substr(str_shuffle($letters), 0, 8);
                $ministrante->id    = null;
                $ministrante->login = $login;
                $ministrante->senha = $senha;
            }
            return $this->post_save($ministrante);
        }
        catch (Exception $exc) {
            throw new Exception($exc->getMessage());
        }
    }

    //Lista todos os ministrantes ou filtro o ministrante desejado conforme parametro passado
    function get_listAll($parameter) {

        $filtroWHERE = "";
        $nomeLike    = "%$parameter%";

        if ($parameter)
            $filtroWHERE = " AND u.nome LIKE :nome";

        $sql = "SELECT m.id,u.nome,u.login,u.senha,m.celular,m.telefone,u.id as idUsuario 
            FROM usuarios u, ministrantes m WHERE u.id=m.idUsuario $filtroWHERE";

        $stmt = DB::prepare($sql);

        if ($parameter)
            $stmt->bindParam("nome", $nomeLike);

        $stmt->execute();

        $result = $stmt->fetchAll();
        return $result;
    }

    //Remove um ministrante do sistema juntamento com seu usuario conforme o id passado
    function post_delete($ministrante) {

        $sqlDeleteMinistrante = "DELETE FROM ministrantes WHERE id = :id";
        $sqlDeleteUsuario     = "DELETE FROM usuarios WHERE id = :idUsuario";

        try {
            DB::beginTransaction();

            $stmtMinistrante = DB::prepare($sqlDeleteMinistrante);
            $stmtMinistrante->bindParam("id", $ministrante->id);
            $stmtMinistrante->execute();

            $stmtUsuario = DB::prepare($sqlDeleteUsuario);
            $stmtUsuario->bindParam("idUsuario", $ministrante->idUsuario);
            $stmtUsuario->execute();

            DB::commit();
        }
        catch (Exception $exc) {
            DB::rollBack();
            throw new Exception($exc->getMessage());
        }
    }

    //lista os ministrantes para edição das informações do mesmo
    public function get_list($id) {

        try {

            $sql = "SELECT * FROM usuarios u INNER JOIN ministrantes m ON u.id = m.idUsuario WHERE m.id = :id";

            $stmt = DB::prepare($sql);
            $stmt->bindParam("id", $id);
            $stmt->execute();
            return ($stmt->fetch());
        }
        catch (Exception $exc) {
            throw new Exception($exc->getMessage());
        }
    }

}

?>
